using System;
using SqlSugar;
using ErrorCode;

namespace Domain
{
    /// <summary>
    /// 工作流步骤实体类
    /// 表示工作流中的一个具体步骤，可以是审批、通知、自动任务等类型
    /// 每个步骤都有其特定的状态、处理人和配置信息
    /// </summary>
    [SugarTable("WorkflowStep")]
    public class WorkflowStep
    {
        /// <summary>
        /// 步骤唯一标识符
        /// 自增主键
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }

        /// <summary>
        /// 所属工作流ID
        /// 关联到具体的工作流实例
        /// </summary>
        [SugarColumn(ColumnName = "WorkflowId")]
        public int WorkflowId { get; set; }

        /// <summary>
        /// 步骤名称
        /// 描述该步骤的具体作用，如"部门经理审批"、"发送邮件通知"等
        /// </summary>
        [SugarColumn(ColumnName = "Name")]
        public string Name { get; set; }

        /// <summary>
        /// 步骤处理人
        /// 可以是具体用户ID、角色ID或者系统标识（用于自动任务）
        /// </summary>
        [SugarColumn(ColumnName = "AssignedTo")]
        public string AssignedTo { get; set; }

        /// <summary>
        /// 步骤当前状态
        /// 包括：待处理、进行中、已完成、已拒绝、已跳过等
        /// </summary>
        [SugarColumn(ColumnName = "Status")]
        public WorkflowStepStatus Status { get; set; }

        /// <summary>
        /// 步骤执行顺序
        /// 在工作流中的排序号，决定了步骤的执行顺序
        /// 数字越小越先执行
        /// </summary>
        [SugarColumn(ColumnName = "Order")]
        public int Order { get; set; }

        /// <summary>
        /// 步骤创建时间
        /// 记录该步骤被创建的具体时间点
        /// </summary>
        [SugarColumn(ColumnName = "CreatedTime")]
        public DateTime CreatedTime { get; set; }

        /// <summary>
        /// 步骤完成时间
        /// 记录该步骤完成的时间点
        /// 如果步骤尚未完成，则为null
        /// </summary>
        [SugarColumn(ColumnName = "CompletedTime")]
        public DateTime? CompletedTime { get; set; }

        /// <summary>
        /// 步骤处理意见
        /// 记录处理人的意见、建议或其他相关说明
        /// 对于自动任务，可以记录执行结果或错误信息
        /// </summary>
        [SugarColumn(ColumnName = "Comment")]
        public string Comment { get; set; }

        /// <summary>
        /// 步骤类型
        /// 定义步骤的行为类型：
        /// - Approval: 需要人工审批
        /// - Notification: 发送通知
        /// - AutomaticTask: 自动执行的任务
        /// - Condition: 条件判断
        /// - Parallel: 并行处理
        /// </summary>
        [SugarColumn(ColumnName = "Type")]
        public WorkflowStepType Type { get; set; }

        /// <summary>
        /// 步骤配置信息
        /// 使用JSON格式存储的配置数据，根据不同的步骤类型存储不同的配置：
        /// - Approval: 可以包含审批规则、超时时间等
        /// - Notification: 可以包含通知模板、接收人规则等
        /// - AutomaticTask: 可以包含任务参数、执行规则等
        /// - Condition: 可以包含条件表达式、分支规则等
        /// - Parallel: 可以包含并行任务配置等
        /// </summary>
        [SugarColumn(ColumnName = "Configuration", IsJson = true)]
        public string Configuration { get; set; }

        /// <summary>
        /// 工作流步骤构造函数
        /// 初始化步骤的基本属性：
        /// 1. 设置创建时间为当前时间
        /// 2. 设置初始状态为待处理（Pending）
        /// </summary>
        public WorkflowStep()
        {
            CreatedTime = DateTime.Now;
            Status = WorkflowStepStatus.Pending;
        }
    }
}